package com.tedu.api.io;

import org.junit.jupiter.api.Test;

import java.io.*;

/**
 * 流 ----专门处理传输数据为：文本
 *
 * 高级流---处理文本--->转换流
 * 字符流：针对读写抽象类【Reader抽象类，Writer抽象类】
 *
 * 节点流与字符流区别：单位进行区分，节点流最小单位：字节
 *                             字符流最小单位：字符【针对文本】
 *
 * 高级流【转换流】功能：处理文本内容
 * 字符流的子实现类：InputStreamReader    继承 Reader抽象类 读入操作
 *                OutputStreamWriter   继承 Writer抽象类 写出操作
 * 高级流--->转换流【字符流】 按照功能划分--->处理文本读写操作
 * 功能：处理节点流又可以被其他流所处理，类似于‘转换器’效果
 */
public class IOSAPI {
    /**
     * 需求：从API文件中 写出 osw.txt文件---一行文本
     */
    @Test
    public void testOSW(){
        //1.所有流全部置空
        FileOutputStream fos=null;  //低级流：搬运数据
        OutputStreamWriter osw=null; //高级流：”转换流：套低级流，套其他高级流“
        //2.捕获流的所有异常 先写  在alt ctrl  t try catch
        try {
            fos=new FileOutputStream("osw.txt");
            osw=new OutputStreamWriter(fos);  //转换流：套低级流
            //3.转换流中方法：write() 直接写出文本内容，不需要吧文本转换为二进制
            //  高级流---转换流---字符流
            osw.write("给烙铁来个双击~~");
            osw.write("666");             //省去传字节数组
            osw.write("777");             //换行
        } catch(FileNotFoundException e){ //路径错 ，文件写错
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {    //必须关闭   有高级流关高级流
            if(osw!=null)
                try {
                    osw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }
    @Test
    public void test02(){
        FileOutputStream diji=null;     //低级流 File
        OutputStreamWriter gaoji=null;  //高级流Out
        try {
            diji=new FileOutputStream("file.txt");
            gaoji=new OutputStreamWriter(diji);                    //套高级流
            gaoji.write("写高级流");
            gaoji.write("再写高级流");                       //ctrl+alt+T（try+catch+finally）
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(gaoji!=null)
                    gaoji.close();             //关闭高级流，报错：再次ctrl+alt+T（try+catch）
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 转换流
     * Writer抽象类---子实现类OutputStreamWriter  字符输出流  以字符形式写出
     * Reader抽象类---子实现类InputStreamReader   字符输入流  不是以字符形式读入
     *                                                    int 二进制值
     * 高级流：针对转换流中InputStreamReader无法直接读入字符串
     * BufferedWriter---直接套在转换流上高级流：缓冲输入出流
     * BufferedReader---直接套在转换流上高级流：缓冲输入流
     * 转换流出现异常：UnsupportedEncodingException编码集转换异常
     *      产生原因：转换流【字符输入/出流】指定编码集不对称
     *              IOException IO型大异常
     */
    @Test
    public void testISR() {
        //1.流置空---方便后面赋值以及关闭操作
        FileInputStream fis=null;
        InputStreamReader isr=null;    //转换流指定编码集，无法读取字符串
        BufferedReader br=null;        //缓冲输入流：结局 读取字符串
        //2.捕获流异常
        try {
            fis=new FileInputStream("osw.txt");
            isr=new InputStreamReader(fis,"UTF8");//套低级流
            //转换流：字符输出流---功能：构造器第二个参数，添加编码集：UTF8 识别文字多，万国码
            br=new BufferedReader(isr);//先尝试调取  输入流   读方法---读取一段字符
            /**
             * read(); 读取若干字符串，直到读完为止【没有换行符】
             *         读取数据返回值字符串
             *         如果返回值不为null，表示所有数据么有读取完毕
             */
            //1.定义引用类型变量
            String line=null;
            //2.【一直】读取一行文本保存line中，判断line不为空---输出文本
            //line=br.readLine()!=null
            while((line=br.readLine())!=null){
                System.out.println(line);
            }
        } catch(FileNotFoundException e){//文件不存在
            e.printStackTrace();
        } catch(UnsupportedEncodingException e){//编码集异常
            e.printStackTrace();
        } catch (IOException e) {//IO流异常---流最大异常
            e.printStackTrace();
        } finally {
            if (br!=null)
                try {
                    br.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }


    /**
     * 高级流---特殊：1.直接创建高级流
     *              2.不是承兑---BufferedReader
     *              3.直接写出文本
     * PrinterWriter  字符输出流
     * 需求：从程序写出  pw.txt  文件   指定编码集：UTF8，输出几行文本
     */
    @Test
    public void testPW() throws FileNotFoundException, UnsupportedEncodingException {
        //创建高级流:套三个流 FileOutputStream 低级流 搬运数据
        //                OutputStreamWriter 高级流转换流  指定编码集
        //                BufferedWriter     高级流套在转换流上 效率写
        PrintWriter pw=new PrintWriter("pw.txt","UTF8");
        //print()  输出一行文本，不换行  println() 输出一行文本，换行
        pw.print("你就是");
        pw.print("我的小可爱");
        pw.close();
    }
}